在命令的执行过程中,我们可能需要需要一些方式,使我们命令的输出更加友好;去除一些没有用的信息,只显示我们所关注的信息。今天我们就来看看,怎么处理命令的输出,使其更加友好。
当我们在系统中运行 Get-Process 时,默认情况下会显示所有的进程,这个结果可能很长,并且我们也不关心所有的进程,有些时候,我们只关注 CPU 或 Memory 使用率靠前的进程:
PS C:\Users\Administrator> Get-Process
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
252 15 4300 15772 0.06 4160 2 backgroundTaskHost
255 14 4136 17680 0.06 4800 2 conhost
325 13 2216 5156 0.09 456 0 csrss
160 9 2532 5152 0.13 532 1 csrss
273 12 2312 5180 0.16 2456 2 csrss
373 15 3508 14904 0.08 3756 2 ctfmon
536 21 15968 35604 0.09 988 1 dwm
593 28 15368 54028 0.22 2820 2 dwm
1620 59 23860 81840 1.69 3328 2 explorer
............
............
我们可以通过我们前面学的管道,对结果进行排序,并只显示前 10 个:
通过 sort 对结果进行排序,通过 -Property 指定基于那个属性排序 ,默认排序方式为升序(从小到大),所以需要使用 -Descending 参数设置为降序;然后再通过 Select-Object 选择前 10 个;
PS C:\Users\Administrator> Get-Process | sort -Property CPU -Descending | Select-Object -First 10
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
1983 103 68748 81336 25.67 1316 0 svchost
749 81 199752 121676 7.42 2144 0 MsMpEng
1772 0 192 144 3.69 4 0 System
352 18 5272 17300 3.36 3852 0 svchost
1452 56 21412 81264 1.83 3328 2 explorer
0 14 7516 21204 1.81 88 0 Registry
502 32 92088 112884 1.50 4472 2 ServerManager
640 22 18532 29772 1.28 812 0 svchost
637 29 63948 77592 1.28 4780 2 powershell
513 23 15120 30184 0.88 1980 0 svchost
命令输出的某些列参数,是我们不关心的,我们可以通过 Format-Table 只显示我们关心的列:
PS C:\Users\Administrator> Get-Process | sort -Property CPU -Descending | Select-Object -First 10 | Format-Table ProcessName,id,CPU
ProcessName Id CPU
----------- -- ---
TiWorker 4512 34.046875
svchost 1316 26.578125
MsMpEng 2144 23.671875
System 4 7.4375
CompatTelRunner 4156 3.578125
svchost 3852 3.359375
Registry 88 1.921875
explorer 3328 1.875
powershell 4780 1.578125
ServerManager 4472 1.5625
除了上面的表格形式输出,我们还可以使用列表的方式输出:
PS C:\Users\Administrator> Get-Process | sort -Property CPU -Descending | Select-Object -First 10 | Format-List
Id : 1316
Handles : 1952
CPU : 27.296875
SI : 0
Name : svchost
Id : 2144
Handles : 744
CPU : 24.28125
SI : 0
Name : MsMpEng
Id : 4
Handles : 1748
CPU : 7.828125
SI : 0
Name : System
Id : 3852
Handles : 349
CPU : 3.359375
SI : 0
Name : svchost
Id : 812
Handles : 645
CPU : 2.4375
SI : 0
Name : svchost
Id : 88
Handles : 0
CPU : 1.984375
SI : 0
Name : Registry
Id : 3328
Handles : 1440
CPU : 1.875
SI : 2
Name : explorer
Id : 4780
Handles : 799
CPU : 1.78125
SI : 2
Name : powershell
Id : 4472
Handles : 497
CPU : 1.65625
SI : 2
Name : ServerManager
Id : 1980
Handles : 529
CPU : 0.9375
SI : 0
Name : svchost
现在,我们所看的结果都是以 key 和 value 的形式存在的。在后面写脚本时,我们有需求只需要 value,并赋值给变量,不需要 key,应该怎么实现呢?
我们来看一下,值显示 CPU 使用率最高的那个进程的 ID:
PS C:\Users\Administrator> Get-Process | sort -Property CPU -Descending | Select-Object -First 1 | Select-Object id
Id
--
1316
PS C:\Users\Administrator> Get-Process | sort -Property CPU -Descending | Select-Object -First 1 | Select-Object id | ForEach-Object {$_.id}
1316